#ifndef LEXICAL_H
#define LEXICAL_H
#include <stdio.h>

#define MAX_LEN 80   /*行缓冲区的最大长度*/
#define END     (-1) // 文件结束

#define MAX_ID_LEN  50 // 标识符最大长度
#define MAX_STR_LEN 50 // 字符串最大长度
#define MAX_NUM_LEN 9   // 十进制数字最大位数

typedef enum symbol // 所有词法记号的枚举
{ 
  INVALID,          // 无效值
  FILE_END,         // 文件结束
  COMMENT,          // 注释
  ID,               // 标识符
  NUM,              // 十进制整数
  CHARA,            // 字符
  STRING,           // 字符串
  ADD,
  SUB,
  MUL,
  DIV,
  MOD,      // %
  INC,      //++
  DEC,      //--
  NOT,      //!
  LEA,      // &
  AND,      // &&
  OR,       // ||
  ASSIGN,   // 赋值 =
  GT,       // >
  GE,       // >=
  LT,       // <
  LE,       // <=
  EQU,      // ==
  NEQU,     //!=
  COMMA,    // 逗号
  COLON,    // 冒号
  SEMICO,   //分号
  LPAREN,   // 左小括号
  RPAREN,   // 右小括号
  LBRACKET, // 左方括号
  RBRACKET, // 右方括号
  LBRACES,  // 左大括号
  RBRACES,  // 右大括号
  BREAK,    // 保留字
  CASE,
  CHAR,
  CONTINUE,
  DEFAULT,
  DO,
  ELSE,
  EXTERN,
  FOR,
  IF,
  INT,
  RETURN,
  SIZEOF,
  SWITCH,
  VOID,
  WHILE,
  SYMBOL_CNT,
} symbol_e;

#define ARR_ELEM_CNT(arr_name) (sizeof(arr_name) / sizeof(arr_name[0]))


symbol_e scanner_get_cur_token(void);
const char *scanner_get_token_id(void);
const char *scanner_get_token_str(void);
const char scanner_get_token_ch(void);
const int scanner_get_token_num(void);
const char scanner_get_cur_ch(void);
const int scanner_get_line_num(void);
const int scanner_get_col_num(void);
const char *scanner_get_file_name(void);
void scanner_set_file_and_name(FILE *f, const char *name);
const char * scanner_get_token_name(void);
void show_token(symbol_e token);
void get_token(void);
void show_color_token(symbol_e token);
void check_symbol_num(void);

#define BLA  "\033[30m" //黑色
#define RED  "\033[31m" //红色
#define GRE  "\033[32m" //绿色
#define YEL  "\033[33m" //黄色
#define BLU  "\033[34m" //蓝色
#define PUR  "\033[35m" //紫色
#define CYA  "\033[36m" //青色
#define WHI  "\033[37m" //白色

// 高亮
#define HI_BLA  "\033[1;30m" //黑色
#define HI_RED  "\033[1;31m" //红色
#define HI_GRE  "\033[1;32m" //绿色
#define HI_YEL  "\033[1;33m" //黄色
#define HI_BLU  "\033[1;34m" //蓝色
#define HI_PUR  "\033[1;35m" //紫色
#define HI_CYA  "\033[1;36m" //青色
#define HI_WHI  "\033[1;37m" //白色

#define CLOSE   "\033[0m"    //还原
#endif /* LEXICAL_H */
